#ifndef B2D_RENDERTARGET_H
#define B2D_RENDERTARGET_H

#include "Color.h"
#include "IRenderable.h"
#include "IUncopyable.h"
#include "Maths.h"

NS_B2D_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Base class for a rendering target, ie, window, texture(render-to-texture)...
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API RenderTarget
	: public IUncopyable
	, public IRenderable
{
protected:
	size2 mSize;
	Color mBackgroundColor;

public:
	RenderTarget(void);
	virtual ~RenderTarget(void);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets render-target handle.
	///
	/// \return	null if it fails, else the render-target handle.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void* getRTHandle(void) const = 0;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the size.
	///
	/// \return	The size.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	const size2& getSize(void) const { return mSize; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Resizes the given render target.
	///
	/// \param	size	The new size.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void resize(const size2& size) { mSize = size; }


	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets background color (read-only)
	///
	/// \return	The background color.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	const Color& getBackgroundColor(void) const { return mBackgroundColor; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets background color (read-write)
	///
	/// \return	The background color.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Color& getBackgroundColor(void) { return mBackgroundColor; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets background color.
	///
	/// \param	c	The color.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setBackgroundColor(const Color& c) { mBackgroundColor = c; }

	// ::IRenderable
	void render(IGraphicsDevice& g) const;
};

NS_B2D_END

#endif
